home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 / Ham Radio 2000.iso / ham2000 / tcp_ip / os2 / pmnos11s / mkname.c < prev    next >
C/C++ Source or Header  |  1993-07-30  |  6KB  |  169 lines

  1. /* New module MKNAME.C  FOR BORLAND C++ VERSION'S 2.0, 3.0 
  2.      and Turboc 2.0
  3.  
  4.    for WG7J 911229 version 1.0 and up
  5.  
  6. BCC C++ 3.0 mods and addition of tmpfile() by WA7TAS
  7.  
  8. CAVEAT:   This module does not include the tempnam() module.  Therefore
  9.       the tempname() function call probably won't work the way
  10.       you think it should.  NOS doesn't use tempnam(), so I
  11.       consider this to be a moot point.
  12.  
  13. NOTE:  This module wouldn't be necessary if Borland BCC C++ 3.0 actually
  14.        used the TMP environment variable as stated in the Borland manual
  15.        set, but it doesn't.  The manual is in error for tmpfile() and
  16.        tmpnam().  If the next version corrects the library code to conform
  17.        to the manual then this module can be removed. If the manual set
  18.        is corrected then this code will still be necessary.  
  19.  
  20. --- Ron Henderson WA7TAS
  21.     crh@cv.hp.com
  22.     March 31, 1992
  23.  
  24.    This module MUST be compiled in such a way that it is forced into
  25.    the _TEXT segment.  This can be accomplished by using the "-zC_TEXT"
  26.    compiler switch with the Borland C++ 3.0 compiler.  I have put this
  27.    switch in a special compilation rule in MAKEFILE for reasons explained
  28.    below.  It is possible to make all of PC.C go into the _TEXT segment,
  29.    but that might put too much in there and cause trouble for the compiler.
  30.    The best way is to put in only what we need, and that is why this must
  31.    be a new and separate module.
  32.  
  33.    To compile this module right, there must be a special compilation rule
  34.    included in MAKEFILE:
  35.  
  36. !if (($(CC) == bcc) || ($(CC) == BCC) || ($(CC) == bccx) || ($(CC) == BCCX)) 
  37. mkname.obj: mkname.c
  38.     $(CC) -c $(MODEL) $(CFLAGS) -zC_TEXT $*.c
  39. !endif
  40.  
  41.    The MAKEFILE must be modified to add MKNAME.OBJ to the list of PCOBJS.
  42.    The file PC.TL must be modified to include MKNAME.OBJ in the list of
  43.    files that are bound into PC.LIB by the librarian.
  44.  
  45.    The tmpnam() and __MKNAME() functions in the run-time library are in
  46.    the same object module, so both have to replaced together.  Those below
  47.    must be used instead of the ones in PC.C; therefore, both tmpnam() and
  48.    __MKNAME() in PC.C should be removed, as should the declaration of the
  49.    variable _tmpnum.  Since these functions are never called from within
  50.    NOS, this module will be preprocessed to have no compilable code in it
  51.    if the compiler is not the right one.
  52.  
  53.    The pascal calling convention specifies that symbols are converted to
  54.    upper case and an underscore character is not automatically prepended.
  55.    It is intended that the __MKNAME() DIRECTLY replace the function of the
  56.    same name in the run-time library.  This __MKNAME() function is called
  57.    from run-time library modules tmpnam(), which is being replaced, and
  58.    from fclose(), which is not.  The whole point of this awful kludge is
  59.    to avoid rewriting fclose(), which would be a lot worse than this.
  60.  
  61.    -- Mike Bilow, 9 July 1991
  62.       N1BEE @ KA1RCI.RI.USA.NA  (AX.25)
  63.       mikebw@idsvax.ids.com  (Internet)
  64.  
  65. */
  66.  
  67. #ifdef __TURBOC__  /* defined in all turboc versions thru BCC C++ 3.0 */
  68.  
  69. #include <stdio.h>        /* for sprintf() */
  70. #include <stdlib.h>
  71. #include <string.h>        /* for strlen() */
  72. #include "global.h"
  73.  
  74. char *getnenv (char *name);    /* In pc.c */
  75. char *tmpnam(char *);
  76. unsigned int _tmpnum = 0;
  77.  
  78. #if __BORLANDC__ == 0x0400  /* Borland C++ Version 3.0 */
  79.   char far * near pascal __MKNAME(char far *, char * prefix, unsigned int);
  80. #else  /* it's not BCC C++ 3.0, use older form */
  81. #ifdef __BORLANDC__
  82.   char far * near pascal __MKNAME __ARGS((char far *tmpname,unsigned int tmpnum));
  83. #else
  84.   char *pascal __MKNAME __ARGS((char *tmpname,unsigned int tmpnum));
  85. #endif
  86. #endif /* __BORLANDC__ == 0x0400 */
  87.  
  88. #if __BORLANDC__ == 0x0400  /* Borland C++ Version 3.0 */
  89.   char far * near pascal 
  90.   __MKNAME(char far * tmpname,char * prefix, unsigned int tmpnum)
  91. #else
  92. #ifdef __BORLANDC__
  93.   char far * near pascal __MKNAME (tmpname,tmpnum)  /* Turbo C++ acc. n1bee */
  94.   char far *tmpname;
  95. #else
  96.   char *pascal __MKNAME (tmpname,tmpnum)          /* The "standard compiler" */
  97.   char *tmpname;
  98. #endif
  99.   unsigned int tmpnum;
  100. #endif  /* __BORLANDC__ == 0x0400 */
  101. {
  102.  
  103.     char *tmpdir,*p;
  104.     static char staticname[80];
  105.  
  106. #if __BORLANDC__ == 0x0400  /* Borland C++ Version 3.0 */
  107.     char pre[4];
  108.  
  109.  
  110.     if (prefix == NULL) 
  111.         strcpy(pre,"TMP");
  112.     else {
  113.         strncpy(pre,prefix,3);
  114.         pre[3]=0;
  115.     }
  116. #endif
  117.     if (tmpname == NULL)
  118.         tmpname = staticname;
  119.  
  120.     p = tmpdir = getnenv("TMP");        /* get tempdir name */
  121.     if (p[0] != '\0')
  122.         p += strlen(p) - 1;        /* point to last character */
  123.  
  124. /* Note that the default is to use root if TMP= is not specified */
  125. #if __BORLANDC__ == 0x0400  /* Borland C++ Version 3.0 */
  126.     sprintf(tmpname,"%s%s%s%u.$$$",tmpdir,
  127.             ((*p != '/' && *p != '\\')? "\\":""),pre,tmpnum);
  128. #else
  129.     sprintf(tmpname,"%s%sTMP%u.$$$",tmpdir,
  130.             ((*p != '/' && *p != '\\')? "\\":""),tmpnum);
  131. #endif
  132.     return tmpname;
  133. } /* __MKNAME */
  134.  
  135. char *tmpnam (char *name)        /* Converted to modern C style */
  136. {
  137.     do
  138.     {
  139.         if (_tmpnum == 0xffff)
  140.              _tmpnum = 2;
  141.         else
  142.              ++_tmpnum;
  143.  
  144. #if __BORLANDC__ == 0x0400  /* Borland C++ Version 3.0 */
  145.         name = __MKNAME(name,"TMP",_tmpnum);
  146. #else
  147.         name = __MKNAME(name,_tmpnum);
  148. #endif
  149.     }
  150.     while (access(name,0) != -1);
  151.  
  152.     return name;
  153. } /* tmpnam */
  154.  
  155. #if __BORLANDC__ == 0x0400  /* Borland C++ Version 3.0 */
  156. FILE * tmpfile(void)
  157. {
  158.     char    s[80];
  159.     FILE    *tmpf;
  160.  
  161.     tmpnam(s); /* Get a unique file name */
  162.  
  163.     if ((tmpf = fopen(s, "w+b")) != NULL)
  164.             tmpf->istemp = _tmpnum;
  165.     return (tmpf);
  166. } /* tmpfil */
  167. #endif  /* __BORLANDC__ == 0x0400 */
  168. #endif  /* ifdef __TURBOC__ */
  169.